package u2

import (
	"bytes"
	"compress/gzip"
	"encoding/base64"
	"io"
)

// Base64Encode 对字符串进行Base64编码，可选择是否进行GZIP压缩
//
// 参数:
//   - s: 需要编码的原始字符串
//   - gzipForm: 是否启用GZIP压缩
//
// 返回值:
//   - string: 编码后的Base64字符串
//   - error: 编码过程中发生的错误
func Base64Encode(s string, gzipForm bool) (string, error) {
	var buf bytes.Buffer
	da := []byte(s)

	if gzipForm {
		gzipWriter := gzip.NewWriter(&buf)
		if _, err := gzipWriter.Write(da); err != nil {
			gzipWriter.Close()
			return "", err
		}
		if err := gzipWriter.Close(); err != nil {
			return "", err
		}
		da = buf.Bytes()
		buf.Reset() // 重置buffer以便重用
	}

	encoder := base64.NewEncoder(base64.StdEncoding, &buf)
	defer encoder.Close()

	if _, err := encoder.Write(da); err != nil {
		return "", err
	}
	if err := encoder.Close(); err != nil {
		return "", err
	}

	return buf.String(), nil
}

// Base64Decode 对Base64编码的字符串进行解码，可选择是否进行GZIP解压缩
//
// 参数:
//   - s: 需要解码的Base64字符串
//   - gzipForm: 是否启用GZIP解压缩
//
// 返回值:
//   - string: 解码后的原始字符串
//   - error: 解码过程中发生的错误
func Base64Decode(s string, gzipForm bool) (string, error) {
	decoder := base64.NewDecoder(base64.StdEncoding, bytes.NewBufferString(s))

	if gzipForm {
		gzipReader, err := gzip.NewReader(decoder)
		if err != nil {
			return "", err
		}
		defer gzipReader.Close()

		// 获取gzip头部信息
		header := gzipReader.Header
		_ = header // 这里可以根据需要检查header字段

		var buf bytes.Buffer
		if _, err := io.Copy(&buf, gzipReader); err != nil {
			return "", err
		}
		return buf.String(), nil
	}

	var buf bytes.Buffer
	if _, err := io.Copy(&buf, decoder); err != nil {
		return "", err
	}
	return buf.String(), nil
}
